home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 1 / QRZ Ham Radio Callsign Database - December 1993.iso / ucsd / packet / tcpip / sys5 / iscwmpst.z / iscwmpst / tcp / src / stime.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-24  |  3.2 KB  |  157 lines

  1. /* @(#) $Header: stime.c,v 1.6 91/05/24 12:10:16 deyke Exp $ */
  2.  
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <time.h>
  6.  
  7. #include "global.h"
  8. #include "mbuf.h"
  9. #include "netuser.h"
  10. #include "timer.h"
  11. #include "udp.h"
  12.  
  13. #define PORT    4713
  14. #define POSTFIX 0xaaaa5555
  15. #define PREFIX  0x5555aaaa
  16.  
  17. struct stime {
  18.   int32 prefix;
  19.   struct timeval tv;
  20.   struct timezone tz;
  21.   int32 chksum;
  22.   int32 postfix;
  23. };
  24.  
  25. struct dests {
  26.   int32 addr;
  27.   struct dests *next;
  28. };
  29.  
  30. static int  err;
  31. static int  rcvd;
  32. static int  sent;
  33. static struct dests *dests;
  34. static struct timer timer;
  35. struct udp_cb *ucb;
  36.  
  37. /*---------------------------------------------------------------------------*/
  38.  
  39. static void stime_recv(iface, up, cnt)
  40. struct iface *iface;
  41. struct udp_cb *up;
  42. int  cnt;
  43. {
  44.  
  45.   struct mbuf *bp;
  46.   struct socket fsock;
  47.   struct stime stime;
  48.  
  49.   recv_udp(up, &fsock, &bp);
  50.   if (pullup(&bp, (char *) &stime, sizeof(struct stime )) != sizeof(struct stime )) goto discard;
  51.   if (stime.prefix != PREFIX || stime.postfix != POSTFIX) goto discard;
  52.   if (stime.tv.tv_sec + stime.tv.tv_usec + stime.tz.tz_minuteswest + stime.tz.tz_dsttime != stime.chksum) goto discard;
  53.   settimeofday(&stime.tv, &stime.tz);
  54.   rcvd++;
  55.   free_p(bp);
  56.   return;
  57.  
  58. discard:
  59.   err++;
  60.   free_p(bp);
  61. }
  62.  
  63. /*---------------------------------------------------------------------------*/
  64.  
  65. static void stime_send(arg)
  66. void *arg;
  67. {
  68.  
  69.   struct dests *pd;
  70.   struct mbuf *bp;
  71.   struct socket fsock, lsock;
  72.   struct stime stime;
  73.  
  74.   lsock.address = INADDR_ANY;
  75.   lsock.port = fsock.port = PORT;
  76.   stime.prefix = PREFIX;
  77.   stime.postfix = POSTFIX;
  78.   for (pd = dests; pd; pd = pd->next) {
  79.     fsock.address = pd->addr;
  80.     bp = alloc_mbuf(sizeof(struct stime ));
  81.     bp->cnt = sizeof(struct stime );
  82.     gettimeofday(&stime.tv, &stime.tz);
  83.     stime.chksum = stime.tv.tv_sec + stime.tv.tv_usec + stime.tz.tz_minuteswest + stime.tz.tz_dsttime;
  84.     memcpy(bp->data, &stime, sizeof(struct stime ));
  85.     send_udp(&lsock, &fsock, 0, 0, bp, 0, 0, 0);
  86.     sent++;
  87.   }
  88.   set_timer(&timer, 3600 * 1000L);
  89.   start_timer(&timer);
  90. }
  91.  
  92. /*---------------------------------------------------------------------------*/
  93.  
  94. int  dostime(argc, argv, p)
  95. int  argc;
  96. char  *argv[];
  97. void *p;
  98. {
  99.  
  100.   int32 addr;
  101.   struct dests *pd;
  102.  
  103.   if (argc < 2) {
  104.     printf("sent %d rcvd %d err %d\n", sent, rcvd, err);
  105.     if (ucb) puts("Receiver active");
  106.     if (dests) {
  107.       puts("Destinations:");
  108.       for (pd = dests; pd; pd = pd->next)
  109.     printf("  %s\n", inet_ntoa(pd->addr));
  110.     }
  111.     return 0;
  112.   }
  113.  
  114.   if (!strcmp(argv[1], "clear")) {
  115.     while (pd = dests) {
  116.       dests = dests->next;
  117.       free(pd);
  118.     }
  119.     return 0;
  120.   }
  121.  
  122.   if (!strcmp(argv[1], "start")) {
  123.     if (!ucb) {
  124.       struct socket sock;
  125.       sock.address = INADDR_ANY;
  126.       sock.port = PORT;
  127.       ucb = open_udp(&sock, stime_recv);
  128.     }
  129.     return 0;
  130.   }
  131.  
  132.   if (!strcmp(argv[1], "stop")) {
  133.     if (ucb) {
  134.       del_udp(ucb);
  135.       ucb = 0;
  136.     }
  137.     return 0;
  138.   }
  139.  
  140.   if (addr = resolve(argv[1])) {
  141.     for (pd = dests; pd; pd = pd->next)
  142.       if (addr == pd->addr) return 0;
  143.     pd = (struct dests *) malloc(sizeof(struct dests ));
  144.     pd->addr = addr;
  145.     pd->next = dests;
  146.     dests = pd;
  147.     timer.func = stime_send;
  148.     timer.arg = 0;
  149.     set_timer(&timer, 3600 * 1000L);
  150.     start_timer(&timer);
  151.     return 0;
  152.   }
  153.  
  154.   return (-1);
  155. }
  156.  
  157.